2核2G的机器,除了FULL GC 其他时候cpu使用率不到10%
full GC超过2秒,大概率会导致当机,阿里云便宜服务不建议开swap,只要用到swap就会当机
- jcmd
- jcmd [pid] VM.flags 查看当前已经设置的vm参数
- jcmd 还有很多很多命令
- 经研究添加参数如下
-Xlog:gc*:gc.log:time:filesize=100m:filecount=2
-XX:ConcGCThreads=2 -XX:G1HeapWastePercent=12 -XX:MaxGCPauseMillis=10 -XX:InitiatingHeapOccupancyPercent=30
-XX:G1PeriodicGCInterval=500 -XX:MinHeapFreeRatio=10 -XX:MaxHeapFreeRatio=40
-XX:MaxDirectMemorySize=64m -Xms384m -Xmx1024m -XX:MetaspaceSize=1m -XX:MaxMetaspaceSize=192m
- 日志相关
- Xlog:gc*:gc.log:time:filesize=100m:filecount=2
- 表示打印gc* 表示GC详细日志,gc.log是输出的文件,filesize是文件最大大小,filecount是最多保留文件数,gc.log.0,gc.log.1
- 回收效率相关
- ConcGCThreads 标记线程,默认2核只有1个,这里改为2
- InitiatingHeapOccupancyPercent 新老混合回收时机,老年代占堆大小的比例,默认45%
- G1HeapWastePercent 混合回收整理出来的空闲空间占heap的5%时(默认值),终止本次回收,加到12
- MaxGCPauseMillis 最大停顿时间,默认200,这里改为100
- 从GC日志上看,效果是当有一次GC时间大于100ms的值后,后面的GC就比前面更频繁
- 同时还有一个等效参数 -XX:GCTimeRatio=n,表示最大可以使用1/n 的时间来用于GC,没有MaxGCPauseMillis好理解
- 定期垃圾收集
- G1PeriodicGCInterval 500ms内如果没有触发垃圾回收就做一次定期回收
- G1PeriodicGCSystemLoadThreshold 定期回收时系统负载最小比例,超过这个比例不进行定期回收
- MinHeapFreeRatio/MaxHeapFreeRatio 空闲内存最小/最大 百分比,默认值 40/70,设置小可以更快的归还内存给系统
- 内存大小相关
- MaxDirectMemorySize:最大直接内存
- Xms 初始堆大小
- Xmx 最大堆大小
- MetaspaceSize 初始元空间大小
- 144m为加载类总数:21724时间占用值,主要避免启动时频繁FULL GC
- MaxMetaspaceSize 元空间最大值
- 不建议低于192m
一些有用的参考
很多网上搜到的参考是没用的
- G1调优实践日记 https://blog.csdn.net/lovejj1994/article/details/109620239
- G1相关参数配置 https://www.cnblogs.com/yu007/p/17900844.html
- Java12 G1GC返回未用堆内存给操作系统 https://www.cnblogs.com/androidsuperman/p/11743103.html
- java 通过shell脚本设置jvm参数 https://blog.51cto.com/u_16175472/8593285
- 参数多的时候,很有用,一行根本编辑不下
- 注意bash变量等号两边不能有空格